package JVM;

public class jvm1 {
    /**
     * 1.程序计数器
     *   Java源码通过编译器编译成.class字节码文件,其中包含JVM指令,操作系统无法直接运行。当运行程序时,JVM
     *   将字节码加载到内存中,通过解释器逐条将JVM指令解释为机器码执行,或者通过即使编译器将热点代码直接编译为本地机器
     *   码以提高性能。Java支持多线程运行,线程之间通过时间片轮转实现交替执行。
     *
     * 2.程序计数器是一块较小的内存空间,记录当前线程正在执行的JVM指令的偏移量,确保线程切换后可以恢复到原来的正确的执行位置。
     *   程序计数器各线程之间计数器互不影响,独立存储。
     *  特点：
     *     每个线程都有独立的程序计数器
     *     程序计数器不存在内存溢出
     */

    /**
     * 2.虚拟机栈(JVM Stack)
     *   虚拟机栈(JVM Stack)是Java虚拟机为每个线程分配的私有内存空间,每个方法在调用时会创建一个栈帧,然后加入到虚拟机栈中。
     *   其中栈帧存储着方法的局部变量表,操作数栈,动态链接和返回地址。(生命周期和线程相同,线程结束时会自动释放对应的内存)。
     *   1.栈中变量：
     *   对于栈中基本数据类型的变量,会直接存储在栈内存中,而不是引用。
     *   对于栈中引用数据类型的变量,栈内存存储的是对象的引用地址,而对象的实际内容存储在堆内存中。
     *  2.栈和栈顶的关系
     *    当调用方法1(栈帧1)时,栈帧1进栈,栈帧1中调用了方法2(栈帧2),栈帧2进栈,当方法2执行完后,栈帧2出战,栈帧1出栈。
     *  3.本地方法栈
     *    本地方法栈是JVM的运行时区域之一,用于支持本地方法的执行。遵循线程私有,按调用顺序管理栈帧的规则,同意存储方法的局部变量
     *    表,操作数栈,动态链接和返回地址，可调整栈内存大小。
     * 4.堆是JVM中最重要的内存区域之一,用于存储所有对象实例和数组。它是被线程共享的内存区域,堆内存受到垃圾回收器管理。
     *   将虚拟机堆内存划分为不同的区域,如新生代,老年代,eden等只是设计风格而已,并不是所有的Java虚拟机都有固定堆内存布局。
     *   上面讲到的新生代,老年代等“经典分代”设计是HotSpot虚拟机的部分垃圾收集器按照这个划分来工作。
     * 5.方法区
     *    方法区是各个线程共享的一块逻辑区域,它用于存储已经被虚拟机加载的类型信息,常量,静态变量,即使编译器编译后的代码缓存等数据。方法区的实现
     *    在Java8后的HotSpot虚拟机采用的是元空间(元空间在本地内存)。
     *    在Java8之前,HotSpot虚拟机采用的是永久代(永久代在堆内存)来实现的方法区,这样HotSpot的垃圾收集器能够像管理Java堆内存一样管理这部分
     *    内存,省去了为方法区编写内存管理代码的工作。但是其他虚拟机实现方法区时不存在永久代的概念。
     * 5.1 运行时常量池和字符串常量池
     *    运行时常量池：java代码编译生成的.class文件包含常量池,里面存储着常量值和符合引用(指向类,方法,字段等的符号化描述)。当类加载到
     *    JVM内存中后就是运行时常量池。
     *    字符串常量池：在方法区中还包含字符串常量池,用于存放常量字符串,确保常量字符串在内存中只存在一份。
     *
     *   对比：运行时常量池每个加载到JVM内存中的类都有一个独立的运行时常量池,存储在元空间,与类绑定。字符串常量池JVM中只有一份全局的字符串常量池，
     *   存储在堆内存,所有类和线程共享。
     *   1.存放位置
     *   在Java8之前,运行时常量池和字符串常量池都存在与永久代,也就是堆内存中,但是Java8之后运行时常量池在于元空间,也就是直接内存,字符串常量池
     *   存在于堆内存中,受垃圾回收器管理。
     *   2.梳理
     *    我们讲到运行时常量池和字符串常量池在Java8之前都存在于永久代,而那时方法区的实现是永久代,所有运行时常量池和字符串常量池都属于方法区。但是
     *    Java8之后方法区的实现是元空间,运行时常量池存在元空间,但字符串常量池并不在元空间,而存在堆内存中
     */

    /**
     * JVM垃圾收集
     *  垃圾收集器(GC)的主要职责是管理堆内存,回收不再使用的对象,释放堆空间。Java中的垃圾回收机制由JVM自动管理,无需手动释放内存,减少了内存泄漏和
     *  内存管理的难题。
     *  这里之所以说是 “主要职责是管理堆内存",是因为GC也会管理方法区,而方法区的实现在Java8之后是元空间,元空间存在于直接内存。
     */

}
